package qc.module.ehs.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import qc.common.core.exception.QCPromptException;
import qc.common.core.utils.DateUtil;
import qc.module.ehs.dto.staffsignin.StaffSignInDto;
import qc.module.ehs.dto.staffsignin.StaffSignInQueryConditionDto;
import qc.module.ehs.entity.EhsStaffSignInRecord;
import qc.module.ehs.mapper.EhsStaffSignInRecordMapper;
import qc.module.ehs.repository.EhsStaffSignInRecordRepository;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * EhsStaffSigninService
 *
 * @author QuCheng Tech
 * @since 2025/6/24
 */
@Service
public class EhsStaffSignInRecordService {
    @Autowired
    private EhsStaffSignInRecordRepository repository;

    /**
     * 查询最新签到记录
     * 查询指定条件内每个人员最新的签到记录；一个人员返回最新一条签到记录，如果查询条件内人员没有签到记录不返回该人员记录；
     *
     * @param condition 查询条件
     * @return java.util.List<qc.module.ehs.dto.staffsignin.StaffSignInDto>
     * @author QuCheng Tech
     * @since 2025/6/24
     */
    public List<StaffSignInDto> queryLatest(StaffSignInQueryConditionDto condition) throws QCPromptException {
        if (condition == null)
            throw new QCPromptException("查询条件不能为空");
        if (StringUtils.isBlank(condition.getOrgcode()))
            throw new QCPromptException("组织代码不能为空");

        //查询时间处理
        Date begintm = null;
        Date endtm = null;
        if (StringUtils.isNotBlank(condition.getBegintm())) {
            try {
                begintm = DateUtil.parseDate(condition.getBegintm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的开始日期转换错误");
            }
        }
        if (StringUtils.isNotBlank(condition.getEndtm())) {
            try {
                endtm = DateUtil.parseDate(condition.getEndtm());
            } catch (Exception e) {
                // 时间转换错误，抛出自定义异常
                throw new QCPromptException("查询条件中的截止日期转换错误");
            }
        }
        //时间段：起始时间必须有，截止时间没有默认为当前时间
        if (begintm == null)
            throw new QCPromptException("查询条件中的开始日期不能为空");
        if (endtm == null)
            endtm = DateUtil.getNowDate();

        LambdaQueryWrapper<EhsStaffSignInRecord> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(EhsStaffSignInRecord::getOrgcode, condition.getOrgcode());
        //起止时间段
        Date finalBegintm = begintm;
        Date finalEndtm = endtm;
        wrapper.and(q -> {
            q.ge(EhsStaffSignInRecord::getTm, finalBegintm).le(EhsStaffSignInRecord::getTm, finalEndtm);
        });
        //如果有指定签到人员ID
        if (condition.getUserid() > 0x0)
            wrapper.eq(EhsStaffSignInRecord::getUserid, condition.getUserid());
        //如果有指定单元ID
        if (StringUtils.isNotBlank(condition.getUnitid()))
            wrapper.eq(EhsStaffSignInRecord::getUnitid, condition.getUnitid());
        //如果有指定任务项ID
        if (StringUtils.isNotBlank(condition.getTaskitemid()))
            wrapper.eq(EhsStaffSignInRecord::getTaskitemid, condition.getTaskitemid());

        //排序：按签到时间降序，最新签到记录在前面
        wrapper.orderByDesc(EhsStaffSignInRecord::getTm);

        List<EhsStaffSignInRecord> ens = repository.selectList(wrapper);
        if (ens != null && ens.size() > 0x0) {
            //需要根据记录按人员进行去重，每个人员只保留最新一条记录
            List<StaffSignInDto> result = new ArrayList<>();
            //记录已有的签到人员ID，如果已有不重复添加到返回集合中
            List<Integer> userIds = new ArrayList<>();
            for (EhsStaffSignInRecord en : ens) {
                boolean hasUserIdExist = false;
                if (en.getUserid() != null && en.getUserid().intValue() > 0x0) {
                    int uid = en.getUserid().intValue();
                    if (userIds.contains(uid))
                        hasUserIdExist = true;
                    else//已添加的签到用户ID增加当前
                        userIds.add(uid);
                }
                if (hasUserIdExist == false)                     //添加到返回集合
                    result.add(EhsStaffSignInRecordMapper.MAPPER.toDto(en));
            }

            return result;
        }

        return null;
    }
}
